﻿Imports System.Xml

Public Class BoxNew
    Inherits CoreClass

    Dim type As Integer = 0
    Dim iW As Integer = 0
    Dim iH As Integer = 0
    ' Gan gia tri cho bien MenuID de kiem tra quyen cua ng dung, gia tri nay lay trog DB va dc fix
    Dim chkMenu As Integer = getIDMenu(12)
    Dim BoxTitle As String = ""

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Try
            type = Integer.Parse(Request.QueryString("type"))
        Catch ex As Exception

        End Try

        Try
            ' Set sự kiện submit cho nút chỉ định
            Page.Form.DefaultButton = btnSearch.UniqueID
            chkPms((CInt(Session("GroupId").ToString())), chkMenu)
            formatCbx()
            writeNavigator()
            If Not Page.IsPostBack Then
                If chkView = 1 Then

                    loadCat()
                    formatCbx()
                    BindGrid1()
                Else
                    'MsgBox(chkView & chkUpdate & chkDelete)
                    objAlert.ErrorBox(Page, "Bạn không có quyền truy xuất trang này, liên hệ với Admin để biết thêm chi tiết.")
                    'Response.Redirect("Default.aspx")
                End If
            End If
        Catch ex As Exception

        End Try
    End Sub

#Region "Các hàm tự viết"

    ' Hàm write danh sách các box
    Private Sub writeNavigator()
        Try
            Dim strHTML As New StringBuilder()
            Dim xml As String = ""
            Dim cnt As Integer = 0
            xml = objFunction.ReadEndFile(Server.MapPath("/") & "static\inSite\ListFile\BoxNavigator.xml")
            Dim rgx As New Regex("\n|\t|\r")
            xml = rgx.Replace(xml, "")
            Dim doc As New XmlDocument()
            doc.LoadXml(xml)
            Dim nodeList As XmlNodeList = doc.GetElementsByTagName("Box")
            For Each n As XmlNode In nodeList
                Dim xml_id As String = n.SelectSingleNode("ID").InnerText
                Dim xml_name As String = n.SelectSingleNode("Name").InnerText
                Dim xml_type As String = n.SelectSingleNode("Type").InnerText
                Dim xml_width As String = n.SelectSingleNode("ImageWidth").InnerText
                Dim xml_height As String = n.SelectSingleNode("ImageHeight").InnerText

                If Integer.Parse(xml_type) = 1 Then ' Type = 1 là box tin tức
                    'Home Top | <a href="MenuOrder.aspx#list">Sắp Xếp</a>
                    If type = 0 Then ' Kiểm tra nếu mơi mở trang thì set Box ID la phần tử đầu tiên trong XML và set ID này vào label de các function lấy đc giá trị ID
                        type = Integer.Parse(xml_id)
                        typeID.Text = Integer.Parse(xml_id)
                        typeName.Text = xml_name
                    End If
                    If Integer.Parse(xml_id) = type Then
                        BoxTitle = xml_name
                        iW = xml_width
                        iH = xml_height
                        If cnt = 0 Then
                            strHTML.AppendLine(xml_name)
                        Else
                            strHTML.AppendLine(" | " & xml_name)
                        End If
                    Else
                        If cnt = 0 Then
                            strHTML.AppendLine("<a style=""margin-left: 2px;margin-right: 2px;"" href=""BoxNew.aspx?type=" & xml_id & " "">" & xml_name & "</a>")
                        Else
                            strHTML.AppendLine(" | <a style=""margin-left: 2px;margin-right: 2px;"" href=""BoxNew.aspx?type=" & xml_id & " "">" & xml_name & "</a>")
                        End If
                    End If
                    cnt = cnt + 1
                End If
            Next
            divNavi.InnerHtml = strHTML.ToString()
            strHTML = Nothing
            doc = Nothing
            nodeList = Nothing
        Catch ex As Exception
            If objConfig.Developer.Equals("1") Then
                objAlert.ErrorBox(Page, "File: " & (New System.Diagnostics.StackTrace).GetFrame(0).GetMethod.DeclaringType.Name & _
                                  " --- Function: " & (New System.Diagnostics.StackTrace).GetFrame(0).GetMethod.Name & _
                                  " --- Mess: " & ex.Message.Replace("'", """"))
            Else
                objAlert.ErrorBox(Page, "Lỗi kỹ thuật, hãy thông báo lại với Admin, xin cảm ơn.")
            End If
        End Try

    End Sub

    ' Hàm lấy danh sách các record của các box
    Private Sub BindGrid1()
        If type = 0 Then
            type = Integer.Parse(typeID.Text)
        End If
        sql = "spi_BoxGetList " & type & ", 2" ' 1=box danh cho san pham, 2=box danh cho tin tuc
        Try
            ds1.ConnectionString = ConnectionString
            ds1.SelectCommand = sql
            grid1.DataBind()
            ' Nếu khong còn sản phẩm nào trong Box thì reset list ID
            If grid1.Rows.Count < 1 Then
                lbl_ListID.Text = ""
            End If
        Catch ex As Exception
            If objConfig.Developer.Equals("1") Then
                objAlert.ErrorBox(Page, "File: " & (New System.Diagnostics.StackTrace).GetFrame(0).GetMethod.DeclaringType.Name & _
                                  " --- Function: " & (New System.Diagnostics.StackTrace).GetFrame(0).GetMethod.Name & _
                                  " --- Mess: " & ex.Message.Replace("'", """"))
            Else
                objAlert.ErrorBox(Page, "Lỗi kỹ thuật, hãy thông báo lại với Admin, xin cảm ơn.")
            End If
        End Try
    End Sub

    ' Hàm format date và tên ảnh để tạo thành link ảnh chuẩn
    Public Function getLinkImg(ByVal strDate As String, ByVal strImg As String) As String
        If strImg = "" Then
            Return "/static/inSite/images/noimage.jpg"
        Else
            Dim d1 As Date = Date.Parse(strDate)
            Dim strSaveFolder As String = "/EditorData/image" & Format(d1, "/yyyy/MM/dd/")
            Return strSaveFolder & strImg
        End If
    End Function

    ' Lấy dữ liệu vào ComboBox Category
    Private Sub loadCat()
        Try
            Dim lst As New List(Of ListItem)
            sql = "spi_CatGetList '1'"
            objData.ExeReader(sql)
            lst.Add(New ListItem(" -- Tất cả danh mục --", "0"))
            Do While objData.dataRead.Read
                lst.Add(New ListItem(objData.dataRead("CatPageName").ToString(), objData.dataRead("listSubCatID").ToString()))
                sql = "spi_getSubCat " & objFunction.ValueCheck(objData.dataRead("CatID").ToString())
                objDataRead.ExeReader(sql)
                Do While objDataRead.dataRead.Read
                    lst.Add(New ListItem(" ---- " & objDataRead.dataRead("SubCatPageName").ToString(), objDataRead.dataRead("SubCatID").ToString()))
                Loop
            Loop
            ' Đưa toàn bộ aray menu vào drop down list
            cbxMenu.Items.AddRange(lst.ToArray)

        Catch ex As Exception
            If objConfig.Developer.Equals("1") Then
                objAlert.ErrorBox(Page, "File: " & (New System.Diagnostics.StackTrace).GetFrame(0).GetMethod.DeclaringType.Name & _
                                  " --- Function: " & (New System.Diagnostics.StackTrace).GetFrame(0).GetMethod.Name & _
                                  " --- Mess: " & ex.Message.Replace("'", """"))
            Else
                objAlert.ErrorBox(Page, "Lỗi kỹ thuật, hãy thông báo lại với Admin, xin cảm ơn.")
            End If
        End Try
    End Sub

    ' Format màu sắc cho các Drop Down List
    Private Sub formatCbx()
        Try
            ' format màu sắc cho combo box DANH MỤC
            cbxMenu.Items(0).Attributes.Add("style", "color:green;background-color:white;")
            ' Định dạng màu sắc cho menu cha
            For i As Integer = 1 To cbxMenu.Items.Count - 1
                Try
                    ' Kiểm tra nếu là Menu cha thi value có dạng: 1,2,3 thì không convert sang Integer được và sẽ nhảy vào Cath để bôi đỏ Menu Cha
                    Integer.Parse(cbxMenu.Items(i).Value)
                Catch ex As Exception
                    ' Tô đậm menu Cha
                    cbxMenu.Items(i).Attributes.Add("style", "color:red;background-color:LightGray;")
                End Try
            Next
        Catch ex As Exception

        End Try
    End Sub

    ' Format Link Detail Product trên Grid View
    Public Function formatLink(ByVal id As String) As String
        Return "~/Inside/Web/New/NewDetail.aspx?id=" & id
    End Function

    ' Format nút đổi ảnh trên Grid View
    Public Function getLink(ByVal id As Integer) As String
        Return "<a class=""Astyle"" href='BoxImageUpdate.aspx?id=" & id & "&type=" & type & "&cate=2&iW=" & iW & "&iH=" & iH & "'>Thay ảnh</a>" ' cate=1(box danh cho san pham), cate=2(box danh cho tin tuc)
    End Function

    ' Hàm lấy dữ liệu sản phẩm khi tìm kiếm ở Grid sản phẩm
    Private Sub BindGrid2()
        Try
            sql = "select * from Out_New (nolock) where 1 = 1 "
            If Not (cbxMenu.SelectedValue = "0" Or cbxMenu.SelectedValue = "") Then
                sql &= " and SubCatID in (" & cbxMenu.SelectedValue & ") "
            End If
            If Not txtTitle.Text = "" Then
                sql &= " and NewTitle like N'%" & txtTitle.Text & "%'"
            End If
            If txtStartDate.Text <> "" Then
                Dim endD As Date
                If txtEndDate.Text <> "" Then
                    endD = Date.Parse(objFunction.formatDateVNtoGlobal(txtEndDate.Text))
                Else
                    endD = Date.Parse(objFunction.formatDateVNtoGlobal(txtStartDate.Text))
                End If
                endD = endD.AddDays(1)
                sql &= " and NewDate >= '" & objFunction.convertDateVNtoOther(txtStartDate.Text, "ymd") & " ' and NewDate < '" & endD.Year & "-" & endD.Month & "-" & endD.Day & "'"
            End If
            sql &= " and NewStt = 1 order by NewID DESC"
            ds2.ConnectionString = ConnectionString
            ds2.SelectCommand = sql
            grid2.DataBind()
        Catch ex As Exception
            If objConfig.Developer.Equals("1") Then
                objAlert.ErrorBox(Page, "File: " & (New System.Diagnostics.StackTrace).GetFrame(0).GetMethod.DeclaringType.Name & _
                                  " --- Function: " & (New System.Diagnostics.StackTrace).GetFrame(0).GetMethod.Name & _
                                  " --- Mess: " & ex.Message.Replace("'", """"))
            Else
                objAlert.ErrorBox(Page, "Lỗi kỹ thuật, hãy thông báo lại với Admin, xin cảm ơn.")
            End If
        End Try
    End Sub

    ' Hàm kiểm tra ảnh của Box và show ra ảnh mặc định nếu Box k có ảnh
    Public Function getImage(ByVal img As String) As String
        If img = "" Then
            Return "/static/inSite/images/noimage.jpg"
        Else
            Return img
        End If
    End Function

#End Region



#Region "Các sự kiện của grid và Button"

#Region "GRID danh sách sản phẩm của Box"

    ' Xử lý sự kiện khi click vào nút UP và DOWN
    Private Sub grid1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles grid1.RowCommand
        If e.CommandName = "Cancel" Then
            ' Goi ham kiem tra quyen delete
            If Not chkDelete = 1 Then
                objAlert.ErrorBox(Page, "Bạn không có quyền sử dụng tính năng này. <br><br>Liên hệ với Admin để biết thêm chi tiết.")
                BindGrid1()
                BindGrid2()
                Exit Sub
            End If
        Else
            ' Goi ham kiem tra quyen update
            If Not chkUpdate = 1 Then
                objAlert.ErrorBox(Page, "Bạn không có quyền sử dụng tính năng này. <br><br>Liên hệ với Admin để biết thêm chi tiết.")
                Exit Sub
            End If
        End If
        If type = 0 Then
            type = Integer.Parse(typeID.Text)
        End If
        Dim action As String = ""
        Dim actionType As Integer = 0
        Dim idBox As Integer = Convert.ToInt32(e.CommandArgument.ToString)
        If e.CommandName = "Up" Then
            sql = "spi_BoxOrder "
            sql &= objFunction.ValueCheck(type) & ","
            sql &= objFunction.ValueCheck(idBox) & ","
            sql &= "'up'"
            action = "Sắp xếp sản phẩm lên trên tại Box " & typeName.Text
            actionType = 2
        ElseIf e.CommandName = "Down" Then
            sql = "spi_BoxOrder "
            sql &= objFunction.ValueCheck(type) & ","
            sql &= objFunction.ValueCheck(idBox) & ","
            sql &= "'down'"
            action = "Sắp xếp sản phẩm xuống dưới tại Box " & typeName.Text
            actionType = 2
        Else
            sql = "spi_BoxDelete "
            sql &= objFunction.ValueCheck(idBox)
            action = "Xóa sản phẩm ra khỏi box " & typeName.Text
            actionType = 0
        End If
        objDataRead.ExeReader(sql)
        If objDataRead.dataRead.Read Then
            If objDataRead.dataRead("Return").Equals(0) Then
                If e.CommandName = "Up" Then
                    objAlert.InfoBox(Page, "Sản phẩm đã ở vị trí trên cùng.", "")
                ElseIf e.CommandName = "Down" Then
                    objAlert.InfoBox(Page, "Sản phẩm đã ở vị trí dưới cùng.", "")
                End If
            Else
                BindGrid1()
                BindGrid2()
                '0 = Xóa, 1 = Thêm mới, 2 = Update, 3 = Khác
                objFunction.writeLog(Session("UserId"), actionType, "Update Module Box " & BoxTitle, action, "")
                'Response.Redirect("Box.aspx?type=" & type)
            End If
        End If
    End Sub

    ' Tạo các dòng khác màu khi data đc fill vào bảng Box Module
    Private Sub grid1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grid1.RowCreated
        'Add CSS class on normal row.
        If e.Row.RowType = DataControlRowType.DataRow And e.Row.RowState = DataControlRowState.Normal Then
            e.Row.CssClass = "normal"
        End If

        'Add CSS class on alternate row.
        If e.Row.RowType = DataControlRowType.DataRow And e.Row.RowState = DataControlRowState.Alternate Then
            e.Row.CssClass = "alt"
        End If

    End Sub

    ' Update ProID vào label lbl_ProID để lấy 1 chuỗi các ID đã được chọn đưa vào Box
    Private Sub grid1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grid1.RowDataBound
        Try
            ' Kiểm tra nếu row index = 0 tức là chạy đến dòng đầu tiên của grid thì xóa hết danh sách ID
            Dim cnt As Integer = Integer.Parse(e.Row.RowIndex.ToString())
            If cnt = 0 Then
                ' Reset lai danh sach ID trong box, danh sach nay se dc update lai khi gọi BinGrid1
                lbl_ListID.Text = ""
            End If

            ' Khai bao doi tuong label de lay ID Pro ID
            Dim lblId As Label = CType(e.Row.FindControl("lbl_ProID"), Label)
            ' Khai bao bien luu tru
            Dim lstID As String = ""
            ' gán biến này bằng Id Pro lấy từ Grid
            lstID = lbl_ListID.Text
            ' Nối với ký tự | để tách các ID
            lstID &= lblId.Text & "|"
            ' Gán lại toàn bộ giá trị vào label
            lbl_ListID.Text = lstID
        Catch ex As Exception

        End Try
    End Sub



#End Region

#Region "GRID danh sách sản phẩm liệt kê sau khi nhấn nút tìm kiếm"

    ' Xử lý sự kiện chuyển trang của Grid sản phẩm liệt kê
    Private Sub grid2_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles grid2.PageIndexChanging
        BindGrid2()
    End Sub

    ' Xử lý sự kiện thêm sản phẩm vào Box
    Private Sub grid2_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles grid2.RowCommand
        If Not chkUpdate = 1 Then
            objAlert.ErrorBox(Page, "Bạn không có quyền sử dụng tính năng này. <br><br>Liên hệ với Admin để biết thêm chi tiết.")
            Exit Sub
        End If
        If type = 0 Then
            type = Integer.Parse(typeID.Text)
        End If
        Dim idPro As Integer = Convert.ToInt32(e.CommandArgument.ToString)
        'MsgBox(e.CommandName & "-" & idPro)
        If e.CommandName = "Up" Then
            'MsgBox(type)
            sql = "spi_BoxInsert "
            sql &= objFunction.ValueCheck(idPro) & ","
            sql &= objFunction.ValueCheck(type) & ",2" ' 1=box danh cho san pham, 2=box danh cho tin tuc
            objData.ExeNonQuery(sql)
            '0 = Xóa, 1 = Thêm mới, 2 = Update, 3 = Khác
            objFunction.writeLog(Session("UserId"), 1, "Thêm tin bài vào Module Box ", typeName.Text, "")
            BindGrid1()
            BindGrid2()
        End If
    End Sub

    ' Tạo các dòng khác màu khi data đc fill vào bảng sản phẩm
    Private Sub grid2_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grid2.RowCreated
        'Add CSS class on normal row.
        If e.Row.RowType = DataControlRowType.DataRow And e.Row.RowState = DataControlRowState.Normal Then
            e.Row.CssClass = "normal"
        End If

        'Add CSS class on alternate row.
        If e.Row.RowType = DataControlRowType.DataRow And e.Row.RowState = DataControlRowState.Alternate Then
            e.Row.CssClass = "alt"
        End If
    End Sub

    ' Kiểm tra sản phẩm nào đã nằm trong Box Module rồi thì ẩn nút thêm vào Box đi
    Private Sub grid2_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grid2.RowDataBound
        Try
            ' Khai bao doi tuong label de lay ID category
            Dim lblId As Label = CType(e.Row.FindControl("lbl_ID"), Label)

            Dim parts As String() = lbl_ListID.Text.Split(New Char() {"|"c})
            'Loop through result strings with For Each
            Dim part As String = ""
            For Each part In parts
                ' So sánh nếu ID Pro da nam trong list ID trong Box rồi thì ẩn nút Update đi
                If lblId.Text.Equals(part) Then
                    ' Khai báo button image
                    Dim imgSelect As ImageButton = CType(e.Row.FindControl("imgSelect"), ImageButton)
                    imgSelect.Visible = False
                End If
            Next
        Catch ex As Exception

        End Try
    End Sub




#End Region

    ' Xử lý sự kiện khi nhấn nút tìm kiếm
    Private Sub btnSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSearch.Click
        If Not chkView = 1 Then
            objAlert.ErrorBox(Page, "Bạn không có quyền sử dụng tính năng này. <br><br>Liên hệ với Admin để biết thêm chi tiết.")
            Exit Sub
        End If
        BindGrid2()
    End Sub

    Private Sub btnClear_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnClear.Click
        txtTitle.Text = ""
        txtStartDate.Text = ""
        txtEndDate.Text = ""
    End Sub

#End Region


    Private Sub btnPublish_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPublish.Click
        ' Goi ham kiem tra quyen them moi
        If Not chkUpdate = 1 Then
            objAlert.ErrorBox(Page, "Bạn không có quuyền sử dụng tính năng này. <br><br>Liên hệ với Admin để biết thêm chi tiết.")
            Exit Sub
        End If
        Try
            Dim srtXML As String = ""
            srtXML &= "<?xml version=""1.0"" encoding=""utf-8"" ?>" & vbCrLf
            srtXML &= "<root>" & vbCrLf

            sql = "spi_BoxGetList " & type & ", 2" ' 1=box danh cho san pham, 2=box danh cho tin tuc
            objDataRead.ExeReader(sql)
            While objDataRead.dataRead.Read
                Dim link As String = "tin-tuc/" & objDataRead.dataRead("SubCatPageNameURI").ToString() & "/" & objDataRead.dataRead("NewTitleURI").ToString() & "-" & objDataRead.dataRead("ProID").ToString()
                Dim image As String = getLinkImg(objDataRead.dataRead("NewDate").ToString(), objDataRead.dataRead("BoxImage").ToString())
                srtXML &= vbTab & "<item>" & vbCrLf
                srtXML &= vbTab & vbTab & "<id>" & objDataRead.dataRead("ProID").ToString() & "</id>" & vbCrLf
                srtXML &= vbTab & vbTab & "<title>" & objDataRead.dataRead("NewTitle").ToString() & "</title>" & vbCrLf
                srtXML &= vbTab & vbTab & "<uri>" & link & "</uri>" & vbCrLf
                srtXML &= vbTab & vbTab & "<image>" & image & "</image>" & vbCrLf
                srtXML &= vbTab & "</item>" & vbCrLf
            End While
            srtXML &= "</root>"
            objFunction.CreateFile(Server.MapPath("/") & "static\outSite\listfiles\new" & type & ".xml", srtXML)
            objFunction.writeLog(Session("UserId"), 1, "Publish box tin tức", BoxTitle, "")
            objAlert.InfoBox(Page, "Publish thành công box tin tức " & BoxTitle, Request.Url.PathAndQuery)
        Catch ex As Exception
            If objConfig.Developer.Equals("1") Then
                objAlert.ErrorBox(Page, "File: " & (New System.Diagnostics.StackTrace).GetFrame(0).GetMethod.DeclaringType.Name & _
                                  " --- Function: " & (New System.Diagnostics.StackTrace).GetFrame(0).GetMethod.Name & _
                                  " --- Mess: " & ex.Message.Replace("'", """"))
            Else
                objAlert.ErrorBox(Page, "Lỗi kỹ thuật, hãy thông báo lại với Admin, xin cảm ơn.")
            End If
        End Try
    End Sub
End Class